#ifndef RTSP_CLIENT
#define RTSP_CLIENT

#include <iostream>
#include <string>
#include <atomic>
#include "./util/rtsp_common.h"
#include "./util/sdp.h"

#define USER_AGENT "min-rtsp-client"
#define READ_SOCK_DATA_LEN 1500

// 传输协议类型
enum TRANSPORT {
    RTP_OVER_TCP = 0,
    RTP_OVER_UDP,
};

// RTSP命令状态
enum RTSPCMDSTAT {
    RTSP_NONE = 0,
    RTSP_OPTIONS,
    RTSP_DESCRIBE,
    RTSP_STEUP,
    RTSP_STEUP_VIDEO,
    RTSP_STEUP_ADUIO,
    RTSP_PLAY,
    RTSP_PLAYING,
    RTSP_COMPLETE,
};

// 解析状态
enum ParseState {
    EMPTY_STATE,
    RTP_TCP_HEADER_STATE,
    RTP_TCP_CONTENT_STATE,
    RTSP_MESSAGE_STATE,
};

// 解析状态
enum ParseState {
    EMPTY_STATE,
    RTP_TCP_HEADER_STATE,
    RTP_TCP_CONTENT_STATE,
    RTSP_MESSAGE_STATE,
};

// RTSP客户端类
class RtspClient{
public:
    // 默认使用UDP传输
    RtspClient(enum TRANSPORT transport = TRANSPORT::RTP_OVER_UDP);
    // 析构函数
    ~RtspClient();
    // 连接到RTSP服务器
    int Connect(char *url);
private:

    ////////////////////////////////////////////////////////
    /// RTSP请求响应
    //////////////////////////////////////////////////////

    // 发送OPTIONS命令
    int SendOPTIONS(const char *url);
    // 解码OPTIONS响应
    int DecodeOPTIONS(const char *buffer, int len);
    // 生成认证头
    std::string GenerateAuthHeader(std::string url, std::string response);
    // 发送DESCRIBE命令
    int SendDESCRIBE(const char *url, const char *authorization = NULL);
    // 解码DESCRIBE响应
    int DecodeDESCRIBE(const char *url, const char *buffer, int len);
    // 发送STEUP命令
    int SendSTEUP(const char *url);
    // 解码STEUP响应
    int DecodeSTEUP(const char *url, const char *buffer, int len);
    // 发送PLAY命令
    int SendPLAY(const char *url);
    // 解码PLAY响应
    int DecodePLAY(const char *url, const char *buffer, int len);

private:
    std::string rtsp_url_ = ""; // RTSP URL
    int rtsp_sd_ = -1; // RTSP套接字描述符
    int cseq = 1; // 序列号
    struct RTSPUrlInfo url_info_; // URL信息
    std::string realm_ = ""; // 认证领域
    std::string nonce_ = ""; // 认证随机数
    std::string content_base_ = ""; // 内容基准
    SDPParse *sdp_ = NULL; // SDP解析器
    std::string video_url_ = ""; // 视频URL
    std::string audio_url_ = ""; // 音频URL
    bool video_setup_ = false; // 视频设置标志
    bool audio_setup_ = false; // 音频设置标志
    enum TRANSPORT rtp_transport_; // RTP传输协议
    std::string session_ = ""; // 会话ID
    int timeout_ = 60; // 超时时间（秒）
    bool connected_ = false; // 连接状态
    enum RTSPCMDSTAT rtsp_cmd_stat_ = RTSPCMDSTAT::RTSP_NONE; // RTSP命令状态
    char buffer_cmd_[4096] = {0}; // 命令缓冲区
    int buffer_cmd_used_ = 0; // 命令缓冲区已用大小
    int buffer_cmd_size_ = 0; // 命令缓冲区大小

    // UDP相关变量
    int rtp_port_video_ = -1;
    int rtcp_port_video_ = -1;
    int rtp_sd_video_ = -1;
    int rtcp_sd_video_ = -1;
    int rtp_port_video_server_ = -1;
    int rtcp_port_video_server_ = -1;

    int rtp_port_audio_ = -1;
    int rtcp_port_audio_ = -1;
    int rtp_sd_audio_ = -1;
    int rtcp_sd_audio_ = -1;
    int rtp_port_audio_server_ = -1;
    int rtcp_port_audio_server_ = -1;

    // TCP相关变量
    int sig0_video_ = 0;
    int sig0_audio_ = 2;

};

#endif